package com.ybkj.o2o.mc.mapper;


import com.ybkj.o2o.mc.common.query.PassengerQuery;
import com.ybkj.o2o.mc.common.query.PassengerQuery2;
import com.ybkj.o2o.mc.entity.Passenger;

import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;


public interface PassengerMapper {
  /**
   * 根据电话号码与系统key查询用户信息.
   *
   * @param phone  电话号码
   * @param appKey 系统key
   * @return 乘客信息
   */
  Passenger selectByPhoneAndAppKey(@Param("phone") String phone, @Param("appKey") String appKey);

  /**
   * 根据身份证号码,appKey查询是否存在乘客.
   *
   * @param idcard 身份证号码
   * @param appKey 系统key
   * @return true存在, false不存在
   */
  Passenger selectByIdcardAndAppKey(@Param("idcard") String idcard, @Param("appKey") String appKey);

  /**
   * 根据Email,appKey查询是否存在乘客.
   *
   * @param email  电子邮件地址
   * @param appKey 系统key
   * @return true存在，false不存在
   */
  Passenger selectByEmailAndAppKey(@Param("email") String email, @Param("appKey") String appKey);

  /**
   * 根据主键和appKey查询乘客.
   *
   * @param id     乘客主键
   * @param appKey 系统key
   * @return 乘客信息
   */
  Passenger selectByIdAndAppkey(@Param("passengerId") Long id, @Param("appKey") String appKey);
  
  /**
   * 根据工号和appKey查询乘客
   * 
   * @param jobNumber
   * @param appKey
   * @return
   */
  Passenger selectByJobNumberAndAppKey(@Param("jobNumber")String jobNumber,@Param("appKey") String appKey);
  
  /**
   * 根据用户名和appKey查询乘客
   * 
   * @param name
   * @param appKey
   * @return
   */
  Passenger selectByNameAndAppKey(@Param("name")String name,@Param("appKey") String appKey);


  /**
   * 保存乘客信息.
   *
   * @param passenger 乘客信息
   * @return 受影响记录数
   */
  int insert(Passenger passenger);

  /**
   * 根据主键与appkey修改乘客信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int update(Passenger passenger);
  
  /**
   * 根据主键与appkey修改乘客完成订单信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateByDate(Passenger passenger);

  /**
   * 根据乘客主键和系统key删除乘客信息.
   *
   * @param passengerId 乘客主键
   * @param appKey      系统key
   * @return 受影响行数
   */
  int delete(@Param("passengerId") Long passengerId, @Param("appKey") String appKey);

  /**
   * 根据乘客主键和系统key更新乘客位置信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateLocation(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新乘客位置信息.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateBlackList(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新用户设备类型.
   *
   * @param passenger 乘客信息
   * @return 受影响行数
   */
  int updateDeviceType(Passenger passenger);

  /**
   * 根据乘客主键和系统key更新乘客金额信息.
   *
   * @param record 乘客信息
   * @return 受影响行数
   */
  int updateBalance(Passenger record);

  /**
   * 根据条件分页查询乘客信息.
   *
   * @param passengerQuery 查询条件
   * @return 乘客信息列表
   */
  List<Passenger> selectByPassengerQuery(PassengerQuery passengerQuery);

  /**
   * 根据条件统计乘客信息.
   *
   * @param passengerQuery 查询条件
   * @return 数量
   */
  long countByPassengerQuery(PassengerQuery passengerQuery);

  /**
   * 查询乘客来源名字.
   *
   * @param appKey 系统key
   * @return 来源列表
   */
  List<String> findChannels(String appKey);

  /**
   * 根据公司,乘客名字查询余额总和.
   *
   * @param companyId     公司主键
   * @param passengerName 乘客名称
   * @param appKey        系统key
   * @return 余额总和
   */
  Double sumDrawMoney(@Param("companyId") Long companyId,
                      @Param("passengerName") String passengerName,
                      @Param("appKey") String appKey);

  /**
   * 根据appKey,type查询乘客.
   */
  @Deprecated
  List<Passenger> selectByTypeAndCompanyId(@Param("type") Integer type,
                                           @Param("companyId") Long companyId,
                                           @Param("appKey") String appKey);

  /**
   * 根据主键查询乘客信息.
   *
   * @param id 乘客主键
   * @return 乘客信息
   */
  Passenger selectByPrimarykey(Long id);

  /**
   * 根据条件分页查询乘客信息.
   *
   * @param passengerQuery 查询条件
   * @return 乘客列表
   */
  List<Passenger> selectByPassengerQuery2(PassengerQuery2 passengerQuery);

  /**
   * 根据条件统计乘客总数.
   *
   * @param passengerQuery 查询条件
   * @return 乘客总数
   */
  long countByPassengerQuery2(PassengerQuery2 passengerQuery);
  /**
   * 根据条件分页查询乘客信息(去掉集合中的客户).
   *
   * @param passengerQuery 查询条件
   * @return 乘客列表
   */
  List<Passenger> selectByPassengerQuery3(PassengerQuery2 passengerQuery);

  /**
   * 根据条件统计乘客总数(去掉集合中的客户).
   *
   * @param passengerQuery 查询条件
   * @return 乘客总数
   */
  long countByPassengerQuery3(PassengerQuery2 passengerQuery);

  /**
   * 根据企业主键查询企业下面的所有乘客信息.
   *
   * @param enterpriseId 企业主键
   * @param appKey       系统key
   * @return 乘客列表
   */
  List<Passenger> selectByEnterpriseAndAppkey(@Param("enterpriseId") Long enterpriseId,
                                              @Param("appKey") String appKey);

  /**
   * 根据企业和系统key删除乘客信息.
   *
   * @param enterpriseId 企业主键
   * @param appKey       系统key
   * @return 删除数量
   */
  int deleteByEnterpriseAndAppkey(@Param("enterpriseId") Long enterpriseId,
                                  @Param("appKey") String appKey);

  /**
   * 根据企业查询乘客信息数量.
   *
   * @param enterpriseId 企业主键
   * @return 数量
   */
  Long countByEnterprise(Long enterpriseId);

  /**
   * 根据企业分页查询乘客信息.
   *
   * @param enterpriseId 企业主键
   * @param offset       偏移量
   * @param rows         每页显示数量
   * @return 乘客列表
   */
  List<Passenger> selectByEnterpriseForPage(@Param("enterpriseId") Long enterpriseId,
                                            @Param("offset") int offset,
                                            @Param("rows") int rows);

  /**
   * 根据系统key和一组电话号码查询乘客信息.
   *
   * @param phones 电话号码组
   * @param appKey 系统key
   * @return 乘客信息
   */
  List<Passenger> selectByPhones(@Param("phones") List<String> phones,
                                 @Param("appKey") String appKey);

  /**
   * 批量保存用户信息.
   *
   * @param passengers 用户信息
   * @return 保存的记录数
   */
  int batchInsert(@Param("passengers")List<Passenger> passengers);

  /**
   * 批量删除用户信息.
   *
   * @param deleteList 用户主键列表
   * @return 删除的记录数
   */
  int batchDelete(@Param("deleteList")List<Long> deleteList);

  /**
   * 批量更新用户信息. 仅仅更新名字和车牌号
   *
   * @param passengers 用户信息列表
   * @return 受影响行数
   */
  int batchUpdate(@Param("passengers")List<Passenger> passengers);

  int updateCompanyName(@Param("companyId")Long companyId,
                        @Param("abbreviation")String abbreviation,
                        @Param("appKey")String appKey);

  List<Passenger> findByGradeId(@Param("gradeId") Long gradeId, @Param("appKey") String appKey);

  int batchUpdateGrade(@Param("gradeId") Long gradeId, @Param("appKey") String appKey);

  int disposeGrade(@Param("gradeId") Long gradeId,@Param("gradeName") String gradeName,
                   @Param("companyId") Long companyId, @Param("appKey") String appKey);

  List<Passenger> findByIds(PassengerQuery passengerQuery);

  Long countByIds(PassengerQuery passengerQuery);

  int updateByDelDepartment(@Param("id")Long id, @Param("appKey") String appKey);

  int batchUpdateByIds(@Param("passengerIds") List<Long> passengerIds,@Param("appKey") String appKey);

  int updateEnterpriseName(@Param("enterpriseId")Long enterpriseId, @Param("enterpriseName")String enterpriseName, @Param("appKey")String appKey);

  int updateDepartmentName(@Param("departmentId")Long departmentId, @Param("departmentName")String departmentName, @Param("appKey")String appKey);

  int updateGradeByEnterpriseId(@Param("enterpriseId")Long enterpriseId, @Param("gradeId")Long gradeId,@Param("gradeName")String gradeName, @Param("appKey")String appKey);

  int updateChannel(@Param("id") Long id, @Param("channelName") String channelName, @Param("appKey")String appKey);

  int updateAllowOverdraw(@Param("enterpriseId")Long enterpriseId, @Param("allowOverdraw")Boolean allowOverdraw, @Param("appKey")String appKey);
  
  Long findByIntroduceType(@Param("introduceType") Integer introduceType,@Param("introducer") String introducer, @Param("companyId") Integer companyId,@Param("appKey")String appKey);

  List<Map<String, Object>> findWeixinInfoByIds(@Param("ids")List<Long> ids);

  List<Passenger> findPassengersWithIntroducerBeforeDate(PassengerQuery passengerQuery);

  int updateWxInfoByPhone(@Param("wxHeadImgUrl") String wxHeadImgUrl, @Param("wxNickName") String wxNickName, @Param("phone")String phone);
}
